無緒 (Cluelessness) 由 Martin Rinard 提出。他在演講時指出:
在開發和維護軟體系統時,應該避免讓開發人員深入了解系統。
因為人的大腦可以處理的資訊有限。若要建立一個日益變大的應用程式,就必須學習「如何讓每個開發人員在不了解整個應用程式的情況下,也能完成軟體開發」。
“無緒” 並不是一個貶義詞。它用來區別兩種層次的理解水平。
生活中我們通常只需要用到 淺層理解。例如,刷牙不需要知道化學式。不需要理解冰箱原理就可以冷凍食品。當然,也有一些人需要了解更深入的內容。像是冰箱的維修人員就要了解較深入的領域知識。但即便如此,維修人員所需要的知識仍屬於 淺層理解,因為他們也不需要了解事物背後的每個小細節和原理。
當然也可以學習每件事物背後的知識原理,但是必要性與 CP 值通常不大。因此大多數人在日常生活中只需要 淺層理解 就足夠了。
在軟體開發中,“無緒” 也表示大部分的時間中,開發人員只需要 淺層理解 就足以應付工作。這裡的 淺層理解 並不是指開發人員不需要懂得編寫程式。以下舉個例子來說明軟體開發中的 淺層理解 與 深層理解 之間的差異。
某天 PM 告知下一個專案是「電子商務網站」。那麼,實作這個網站有兩種做法:
在專案初始階段:
我需要打開 HTTP 協定的文件,解析 HTTP 傳輸格式、
研究如何實現 POST、GET 請求....等等。
此外還要閱讀 RFC 文件,並實現文件中的各項內容。
全部都搞定後才能開始打造「電子商務網站」。
在專案初始階段,在作業系統中下載並安裝 Apache、PHP、MySQL,
設定妥當後即開始打造「電子商務網站」。
相信 實作方法二 才是大家熟悉開發的方式,因為現代軟體都是基於組件組裝出來的,沒有人需要獨自從頭到尾完成所有內容。在一個作業系統上安裝 Web 服務並開始編寫 HTML,對現在的開發人員來說是易如反掌。但事實上光是 Web 服務就已經複雜到極點,應該沒人敢說自己了解 Web 服務的所有內容。這一現象正是 淺層理解 的體現,讓開發人員在大部分的時間中,只需要掌握系統、框架、程式庫的使用方法,即可以將現成的組件應用到自己的應用程式,或是在組件上堆疊自己的應用程式。
我們的目標是找到一種軟體開發的實踐方式:讓開發人員不用深入了解所有組件或者模組的實現原理,僅用最少的知識就可以很好地完成自己所需要的功能。這種開發方式被稱為「選擇性無緒(selective cluelessness)」。
選擇性無緒 的思維,正好符合軟體設計原則的 緊湊性。當一個程式具有緊湊性時,即具有「易於理解、使用、組合」等特性。這些特性讓使用者幾乎可以不用閱讀文件,即可自然而然的使用這些程式。但是要注意的是,緊湊性並不等同於「容易學習」。
以下提供一個緊湊與不緊湊的範例:
// 時間格式轉換
var now = new Date();
var year = now.getFullYear();
var month = ("0" + (now.getMonth() + 1)).slice(-2);
var day = ("0" + (now.getDate() + 1)).slice(-2);
var hour = ("0" + (now.getHours() )).slice(-2);
var minute = ("0" + now.getMinutes() ).slice(-2);
var second = ("0" + now.getSeconds() ).slice(-2);
year + '/' + month + '/' + day + ' ' + hour + ':' + minute+ ':' + second;
// 時間格式轉換
moment().format('YYYY/MM/DD HH:mm:ss');
若程式設計得當,維護人員就可以使用 淺層理解 來學習你的程式。若程式設計得不夠緊湊,維護人員往往需要將頭腦切換成 深層理解 的模式來探索你的程式碼,並學習是如何運作的。
因此編寫程式的過程中,應該時時刻刻想著如何讓你的程式變得 “無緒”,讓使用者可以用最少的力氣學習你的程式。這樣的設計思維適用於「函式、類別、模組、類別庫、架構、框架以及系統」的情境。也就是 Martin Rinard 所說的:
軟體設計要盡可能做到 “無緒”。讓開發人員可以在對系統很少了解的前提下,仍然可以完成開發的工作。
文章內容整理自以下書籍並加以歸納與簡化: